package jmind.core.support.locks;

import jmind.base.util.Host;

import java.util.concurrent.TimeUnit;

/**
 * description:分布式锁接口
 * @author weibo.xie
 * @date : create in 4:10 下午 2021/6/23
 */
public interface DistributedLock {

     /**
      *  尝试获取锁
      * @param key
      * @param expire
      * @return
      */
     boolean tryLock(String key,int expire) ;
     /**
      * 解锁
      * @param key
      * @return
      */
     boolean unlock(String key);

     /**
      * 执行分布式锁的相关操作
      * @param key
      * @param runnable
      */
     default void doLock(String key,Runnable runnable){
          try{
               lock(key);
               runnable.run();
          }finally {
               unlock(key);
          }
     }

     default void lock(String key){
          lock(key,Integer.MAX_VALUE,600,5);
     }

     /**
      *
      * @param key 分布式缓存key
      * @param failCount  尝试次数
      * @param expire 过期时间单位秒
      * @param millis  等到时长，单位毫秒
      */
      default void lock(String key,int failCount,int expire,long millis) {
          for (int i=0;i<failCount;i++) {
               //轮询自增
               if (tryLock(key,expire)) {
                    break;
               }
               try {
                    //如果获取失败了，则记录下日志
                    TimeUnit.MILLISECONDS.sleep(millis);
               } catch (InterruptedException e) {
               }
          }
     }


     //每台机器的唯一标识串，为了使同一台机器的相同线程可重入而设置
      default String getRequestId() {
          return Host.getHostName() + ":" + Thread.currentThread().getName();
     }




}
